package com.extension.company.common.permission;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;

import com.extension.company.admin.R;

/**
 * 申请权限的activity
 */
public class PermissionsActivity extends AppCompatActivity {

	public static final int PERMISSIONS_GRANTED = 0; // 权限授权
	public static final int PERMISSIONS_DENIED = 1; // 权限拒绝
	private static final int PERMISSION_REQUEST_CODE = 0; // 系统权限管理页面的参数
	private static final String EXTRA_PERMISSIONS = "me.chunyu.clwang.permission.extra_permission"; // 权限参数
	private static final String PACKAGE_URL_SCHEME = "package:"; // 方案


	private boolean isRequireCheck; // 是否需要系统权限检测

	/**
	 * 启动当前权限页面的公开接口（跳转方法）
	 *
	 * @param activity    要申请权限的activity
	 * @param requestCode 申请码
	 * @param permissions 权限数组
	 */

	public static void startActivityForResult(Activity activity, int requestCode, String... permissions) {
		Intent intent = new Intent(activity, PermissionsActivity.class);
		intent.putExtra(EXTRA_PERMISSIONS, permissions);  // 传递权限数组
		ActivityCompat.startActivityForResult(activity, intent, requestCode, null);
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		if (getIntent() == null || !getIntent().hasExtra(EXTRA_PERMISSIONS)) {
			throw new RuntimeException("PermissionsActivity需要使用静态startActivityForResult方法启动!");
		}
		setContentView(R.layout.activity_permissions);  // 设置布局是透明的
		isRequireCheck = true;
	}

	@Override
	protected void onResume() {
		super.onResume();
		if (isRequireCheck) {  // 是否检测权限
			String[] permissions = getPermissions();  // 获取权限 数组
			if (PermissionsChecker.lacksPermissions(this, permissions)) {  //调用lacksPermissions方法判断权限组是否缺少权限。true 缺少权限
				requestPermissions(permissions); // 权少权限，就去调用方法requestPermission去获取权限
			} else {
				allPermissionsGranted(); // 全部权限都已获取
			}
		} else {
			isRequireCheck = true;
		}
	}

	/**
	 * 返回传递的权限参数（将intent传送过来的权限保存到当前）
	 *
	 * @return 权限数组
	 */

	private String[] getPermissions() {
		return getIntent().getStringArrayExtra(EXTRA_PERMISSIONS);
	}


	/**
	 * 请求权限兼容低版本
	 *
	 * @param permissions 权限组
	 */
	private void requestPermissions(String... permissions) {
		ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
	}


	/**
	 * 全部权限均已获取
	 */
	private void allPermissionsGranted() {
		setResult(PERMISSIONS_GRANTED);  // 返回权限全部授予
		finish();
	}

	/**
	 * 用户权限处理,
	 * 如果全部获取, 则直接过.
	 * 如果权限缺失, 则提示Dialog.
	 * 用户申请权限后的回调
	 *
	 * @param requestCode  权限请求码
	 * @param permissions  权限数组
	 * @param grantResults 权限申请后，授权返回结果数组
	 */
	@SuppressLint("Override")
	public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
		if (requestCode == PERMISSION_REQUEST_CODE && hasAllPermissionsGranted(grantResults)) {  // 全部的授权
			isRequireCheck = true;
			allPermissionsGranted();
		} else {                     // 有未授权的权限，则弹窗提醒
			isRequireCheck = false;
			showMissingPermissionDialog(); // 弹出二次提醒的dialog
		}
	}

	/**
	 * 含有全部的权限---如果全部都授权了，就返回true,否则就返回false
	 *
	 * @param grantResults 申请权限后，系统返回的授权的结果
	 * @return true  权限数组全部授权   false  权限数组有未授权的
	 */
	private boolean hasAllPermissionsGranted(int[] grantResults) {
		for (int grantResult : grantResults) {
			if (grantResult == PackageManager.PERMISSION_DENIED) { // 授权申请 == 权限拒绝
				return false;
			}
		}
		return true;
	}


	/**
	 * 显示缺失权限提示--权限拒绝后再次提示的界面
	 */
	private void showMissingPermissionDialog() {
		AlertDialog.Builder builder = new AlertDialog.Builder(PermissionsActivity.this);
		builder.setTitle("帮助");
		builder.setMessage("当前应用缺少必要权限");

		// 拒绝, 退出应用
		builder.setNegativeButton("退出", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				setResult(PERMISSIONS_DENIED);  // 返回权限被拒绝
				finish();
			}
		});

		builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {  // 跳转到系统权限设置界面，让用户自己设置权限
			@Override
			public void onClick(DialogInterface dialog, int which) {
				startAppSettings();   // 跳转到系统权限设置界面
			}
		});

		builder.show();
	}


	/**
	 * 跳转到手机系统设置权限的界面
	 */
	private void startAppSettings() {
		Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
		intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));
		startActivity(intent);
	}
}
